package com.cb2.algorithm.leetcode;

/**
 * <a href="https://leetcode.cn/problems/delete-the-middle-node-of-a-linked-list">删除链表的中间节点(Delete the Middle Node of a Linked List)</a>
 * <p>给你一个链表的头节点 head 。删除 链表的 中间节点 ，并返回修改后的链表的头节点 head 。</p>
 * <p>长度为 n 链表的中间节点是从头数起第 ⌊n / 2⌋ 个节点（下标从 0 开始），其中 ⌊x⌋ 表示小于或等于 x 的最大整数。</p>
 * <p>  对于 n = 1、2、3、4 和 5 的情况，中间节点的下标分别是 0、1、1、2 和 2 。</p>
 * <p>
 * <b>示例：</b>
 * <pre>
 * 示例 1：
 *
 *      输入：head = [1,3,4,<a color='red'>7</a>,1,2,6]
 *      输出：[1,3,4,1,2,6]
 *      解释：
 *          由于 n = 7 ，值为 7 的节点 3 是中间节点。
 *          返回结果为移除节点后的新链表。
 *
 * 示例 2：
 *
 *      输入：head = [1,2,<a color='red'>3</a>,4]
 *      输出：[1,2,4]
 *      解释：
 *          对于 n = 4 ，值为 3 的节点 2 是中间节点。
 *
 * 示例 3：
 *
 *      输入：head = [2,<a color='red'>1</a>]
 *      输出：[2]
 *      解释：
 *          对于 n = 2 ，值为 1 的节点 1 是中间节点。
 *          值为 2 的节点 0 是移除节点 1 后剩下的唯一一个节点。
 * </pre>
 * </p>
 * <p>
 * <b>提示：</b>
 * <ul>
 *     <li>链表中节点的数目在范围 [1, 10^5] 内</li>
 *     <li>1 <= Node.val <= 10^5</li>
 * </ul>
 * </p>
 *
 * @author c2b
 * @since 2023/11/13 13:45
 */
public class LC2095DeleteTheMiddleNodeOfLinkedList_M {

    static class Solution {
        public ListNode deleteMiddle(ListNode head) {
            ListNode dummyHead = new ListNode(-1, head);
            ListNode fast = dummyHead;
            ListNode slow = dummyHead;
            while (fast.next != null && fast.next.next != null) {
                slow = slow.next;
                fast = fast.next.next;
            }
            slow.next = slow.next.next;
            return dummyHead.next;
        }
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        Printer.printListNode(solution.deleteMiddle(Generator.create(1, 3, 4, 7, 1, 2, 6)));
        Printer.printListNode(solution.deleteMiddle(Generator.create(1, 2, 3, 4)));
        Printer.printListNode(solution.deleteMiddle(Generator.create(2, 1)));
    }
}